home *** CD-ROM | disk | FTP | other *** search
- // Gestionnaire de Scroller V0.34
- // (C) 1992 Christophe PASSUELLO
- // Thu Jan 28 15:06:39 1993
-
-
- #include <exec/types.h>
- #include <exec/memory.h>
- #include <mytypes.h>
- #define INTUITION_PREFERENCES_H 0
- #include <intuition/intuition.h>
- #include "IObject_priv.h"
-
-
- // Prototypes des methodes virtuelles
- PRIVATE BOOL ScrollerMsg(struct Scroller *, struct IntuiMessage *);
- PRIVATE VOID EraseScroller(struct Scroller *);
- PRIVATE VOID DisplayScroller(struct Scroller *);
- PRIVATE VOID ModifyScroller(struct Scroller *, ULONG, ULONG, ULONG);
- PRIVATE UWORD ScrollerValue(struct Scroller *);
- PRIVATE VOID OnScroller(struct Scroller *);
-
- struct Scroller
- {
- struct ObjectTMV *TMV;
- UWORD ObjectID;
- UWORD Flags;
- STRPTR LabelText;
- struct TextFont *Font;
- struct Window *window;
- struct Requester *requester;
- UWORD ClassFlags;
- struct Box BorderBox;
- struct Gadget Gadget;
-
- struct PropInfo PropInfo;
- struct Image Image;
- UWORD CurPos;
- UWORD KnobSize;
- UWORD MaxSize;
- };
-
-
- // Table des methodes virtuelles
- const static struct ObjectTMV ScrollerMethod=
- {
- CLASS_SCROLLER, sizeof(struct Scroller),
- DisposeObject,ScrollerMsg,AddObject,RemoveObject,DisplayScroller,EraseScroller,
- ModifyScroller, ScrollerValue, OffObjectGad, OnScroller, DoNothing
- };
-
-
- //
- // Alloue et initialise un Scroller
- //
- struct Scroller *CreateScroller(struct NewScroller *ns, UWORD ID)
- {
- struct Scroller *sc;
-
- if (sc = (struct Scroller *) AllocMem( sizeof(struct Scroller), MEMF_PUBLIC|MEMF_CLEAR))
- {
- sc->TMV = &ScrollerMethod;
- sc->ObjectID = ID;
- sc->CurPos = ns->Pos;
- sc->KnobSize = ns->CurSize;
- sc->MaxSize = ns->MaxSize;
-
- // recupere les champs de NewScroller
- InitObjectGad((struct ObjectGad *) sc, (struct NewObject *) ns);
- AdjustBox( (struct Box *) &sc->Gadget.LeftEdge, FALSE);
-
- // initialise le gadget
- sc->Gadget.Flags = GADGHCOMP;
- sc->Gadget.Activation = GADGIMMEDIATE|RELVERIFY|FOLLOWMOUSE;
-
- if (sc->ClassFlags & SC_NOMOUSE)
- sc->Gadget.Activation &= (~FOLLOWMOUSE);
-
- sc->Gadget.GadgetType = PROPGADGET;
-
- sc->Gadget.GadgetRender = &sc->Image;
- sc->Gadget.SpecialInfo = &sc->PropInfo;
-
- // Initialise le PropInfo
- sc->PropInfo.Flags = AUTOKNOB|PROPBORDERLESS;
- if (ns->NewObj.ClassFlags & SC_VERTICAL)
- {
- sc->PropInfo.Flags |= FREEVERT;
- sc->PropInfo.VertBody = MAXBODY;
- }
- else
- {
- sc->PropInfo.Flags |= FREEHORIZ;
- sc->PropInfo.HorizBody = MAXBODY;
- }
- }
- return (sc);
- }
-
-
- //
- // Renvoie la position du curseur
- //
- PRIVATE UWORD ScrollerValue(struct Scroller *sc)
- {
- return(sc->CurPos);
- }
-
-
- //
- // Change les valeurs du Scroller
- //
- PRIVATE VOID ModifyScroller(struct Scroller *sc, ULONG Pos, ULONG Size, ULONG Max)
- {
- ULONG body, pot;
-
- // Correction des entrees
- Size = MIN(Size, Max);
- Pos = MIN(Pos, Max - Size);
-
- // calcule le Body et le Pot
- if (Size == Max)
- {
- body = MAXBODY;
- pot = 0;
- }
- else
- {
- body = (MAXBODY * Size) /Max;
- pot = (MAXPOT * Pos) / (Max - Size);
- }
-
- // met a jour le Scroller
- sc->KnobSize = Size;
- sc->MaxSize = Max;
- sc->CurPos = Pos;
-
- if (sc->ClassFlags & SC_VERTICAL)
- {
- sc->PropInfo.VertPot = pot;
- sc->PropInfo.VertBody = body;
- }
- else
- {
- sc->PropInfo.HorizPot = pot;
- sc->PropInfo.HorizBody = body;
- }
-
- // rafraichie le scroller
- if (!(sc->Flags & OBJ_DISABLED))
- NewModifyProp(&sc->Gadget, sc->window, sc->requester, sc->PropInfo.Flags,
- pot , pot, body, body, 1L);
- }
-
-
- //
- // gestion de l'IntuiMessage pour le scroller
- //
- PRIVATE BOOL ScrollerMsg(struct Scroller *sc, struct IntuiMessage *msg)
- {
- ULONG pos;
- BOOL changed;
-
- switch (msg->Class)
- {
- case GADGETUP:
- SetActiveObject(NULL, 0L);
- case MOUSEMOVE:
- UWORD diff;
-
- diff = sc->MaxSize - sc->KnobSize;
- if (sc->ClassFlags & SC_VERTICAL)
- pos = (sc->PropInfo.VertPot * diff) / MAXPOT;
- else
- pos = (sc->PropInfo.HorizPot * diff) / MAXPOT;
- if (sc->CurPos == pos)
- changed = FALSE;
- else
- {
- sc->CurPos = pos;
- changed = TRUE;
- }
- break;
- case GADGETDOWN:
- SetActiveObject((struct Object *) sc, GADGETUP|GADGETDOWN|MOUSEMOVE);
- changed = FALSE;
- break;
- }
- return (changed);
- }
-
-
- //
- // Efface le Scroller
- //
- PRIVATE VOID EraseScroller(struct Scroller *sc)
- {
- EraseObjectFrame( (struct Object *) sc , &sc->BorderBox);
- }
-
-
- //
- // Affiche le Scroller
- //
- PRIVATE VOID DisplayScroller(struct Scroller *sc)
- {
- struct RastPort *rp;
- struct TextEnv env;
-
- if (sc->window)
- {
- rp = sc->window->RPort;
-
- ModifyScroller(sc, sc->CurPos, sc->KnobSize, sc->MaxSize);
-
- SaveTextEnv(sc->window->RPort, &env);
- FastDraw3DBox( (struct Box *) &sc->BorderBox, rp, BOX_1OUT);
- PrintObjectLabel( (struct Object *) sc, (struct Box *) &sc->BorderBox);
- RestoreTextEnv(rp, &env);
-
- if (sc->Flags & OBJ_DISABLED)
- OffObjectGad( (struct ObjectGad *) sc);
- }
- }
-
-
- //
- // Unghoste le scroller
- //
- PRIVATE VOID OnScroller(struct Scroller *sc)
- {
- if (sc->Flags & OBJ_DISABLED)
- {
- EraseBox( (struct Box *) &sc->Gadget.LeftEdge, sc->window->RPort);
- OnGadget(&sc->Gadget, sc->window, sc->requester);
- sc->Flags &= (~OBJ_DISABLED);
-
- ModifyScroller(sc, sc->CurPos, sc->KnobSize, sc->MaxSize);
- }
- }
-